/**
 * 这里可以放一些公共方法
 */

import router from '../router';

/**
 * 将对象序列化后方便放到url上
 * @param obj {object} 对象中各key对应的value值请使用简单的值，不要传什么对象数组之类的
 * @returns {string}
 */
const serializeObject = (obj) =>
    Object.keys(obj)
        .map((key) => `${key}=${obj[key] || ''}`)
        .join('&');

// 获取要带到页面上的公共参数
const getCommonUrlParams = () => ({
    // 注意：下面的s字段仅仅是示例，实际请换成你自己的url公参
    s: 'source1', // 来源
});

/**
 * 跳到新页面
 * @param pathname {string} 要跳转的地址（不含参数），如果是在本单页应用内部跳转，直接给`/`开头的路径，如果要跳转到外部给`http(s)://`开头的地址
 * @param query {object} url上要带的参数（对象形式）
 * @param replace {boolean} 若为true，不会新增历史记录，直接替换当前历史记录
 */
export const goPage = ({ pathname, query, replace }) => {
    const finalQuery = { ...getCommonUrlParams(), ...query };

    if (pathname.startsWith('/')) {
        if (replace === true) {
            router.replace({ path: pathname, query: finalQuery });
        }
        router.push({ path: pathname, query: finalQuery });
        return;
    }

    const targetUrl = `${pathname}?${serializeObject(finalQuery)}`;
    if (replace === true) {
        location.replace(targetUrl);
        return;
    }
    location.href = targetUrl;
};

/**
 * 将当前页替换成新的地址（不增加历史记录，直接替换当前记录）
 * @param pathname {string} 要跳转的地址（不含参数），如果是在本单页应用内部跳转，直接给`/`开头的路径，如果要跳转到外部给`http(s)://`开头的地址
 * @param query {object} url上要带的参数（对象形式）
 */
export const replacePage = ({ pathname, query }) => goPage({ pathname, query, replace: true });
